# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys

import cPickle as pickle
from generales import *
from unidades.aliens.aliens_ataque import *
from unidades.robots.robots_defensa import *
from widgets import *
from widgets import ListBox

ANCHO = 1000
ALTO = 860

class Game:
    def __init__(self):
        self.director = Director()
        self.menu_principal = MenuInicio(self.director)


class Director:
    def __init__(self):
        pygame.init()
        self.pantalla = pygame.display.set_mode((ANCHO, ALTO))
        pygame.display.set_caption("robots vs aliens")
        self.escena = None
        self.fin = False
        self.tiempo = 0
        self.clock = pygame.time.Clock()
    def loop(self):
        while not self.fin:
            self.tiempo += 1
            self.clock.tick(60)
            self.escena.update()
            self.escena.draw(self.pantalla)
            self.escena.event()
            pygame.display.update()
    def cambia_scena(self, escena):
        self.escena = escena
        self.fin = False
    def quit(self):
        self.fin = True

class MenuInicio:
    def __init__(self, director):
        self.director = director
        self.fondo_imagen = pygame.image.load("images/menuinicio.png")
        self.boton_cambio = Boton("images/cambiar1.png", "images/cambiar2.png", 485, 405)
        self.boton_jugar = Boton("images/jugar1.png", "images/jugar2.png", 485, 485)
        self.boton_metro = Boton("images/metro1.png", "images/metro2.png", 485, 565)
        self.boton_credits = Boton("images/credits1.png", "images/credits2.png", 485, 645)
        self.boton_salir = Boton("images/salir1.png", "images/salir2.png", 485, 725)
        self.perfiles = []
        self.jugador = Text(None, 40)
        #self.cargar_perfiles()
        self.guardar_perfil()
        if len(self.perfiles) == 0:
            self.perfil_actual = object()
            print self.perfil_actual
            self.jugador.set("Crear un nuevo perfil")
        else:
            self.perfil_actual = self.perfiles[0]
            self.jugador.set("¡Bienvenido " + self.perfil_actual.id + "!")
        self.logger = Logger(self.director, self.perfiles, self.perfil_actual)
    def cargar_perfiles(self):
        fichero = file("saved/perfiles.dat")
        self.perfiles = pickle.load(fichero)
    def guardar_perfil(self):
        fichero = file("saved/perfiles.dat", "w")
        pickle.dump(self.perfiles, fichero)
        fichero.close()
    def event(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit(0)
            self.jugador.on_event(event)
            self.boton_cambio.on_event(event)
            self.boton_jugar.on_event(event)
            self.boton_credits.on_event(event)
            self.boton_metro.on_event(event)
            self.boton_salir.on_event(event)
        if self.boton_jugar.is_clickeado():
            if len(self.perfiles)==0:
                self.logger.activo = True
                self.boton_jugar.clickeado = False
            else:
                self.director.quit()
        if self.boton_cambio.is_clickeado():
            self.logger.activo = True
            self.boton_cambio.clickeado = False
    def update(self):
        pass
    def draw(self, pantalla):
        pantalla.blit(self.fondo_imagen, (0, 0))
        self.boton_cambio.draw(pantalla)
        self.boton_jugar.draw(pantalla)
        self.boton_credits.draw(pantalla)
        self.boton_metro.draw(pantalla)
        self.boton_salir.draw(pantalla)
        self.jugador.render(pantalla, pygame.Color("black"), (300, 340))
        if self.logger.activo:
            self.logger.draw_cortina(pantalla)
            while self.logger.activo is True:
                self.logger.draw(pantalla)
                self.logger.event()
                pygame.display.update()
            self.guardar_perfil()
            self.jugador.set("¡Bienvenido " + self.logger.actual.id + "!")

class Logger:
    def __init__(self, director, lista, actual):
        self.director = director
        self.cortina = pygame.image.load("images/cortina.png").convert_alpha()
        self.fondo_imagen = pygame.image.load("images/logger2.png").convert_alpha()
        self.boton_crear = Boton("images/crear1.png", "images/crear2.png", 480, 400)
        self.boton_seleccionar = Boton("images/seleccionar1.png", "images/seleccionar2.png", 400, 590)
        self.boton_eliminar = Boton("images/eliminar1.png", "images/eliminar2.png", 580, 590)
        self.entry = Text(None, 30)
        self.activo = False
        self.perfiles = lista
        self.actual = actual
        self.lista = ListBox(lista, 360, 460)
    def event(self):
        if self.activo:
            for event in pygame.event.get():
                self.entry.on_event(event)
                self.boton_crear.on_event(event)
                self.boton_seleccionar.on_event(event)
                self.boton_eliminar.on_event(event)
                self.lista.on_event(event)
            if self.boton_crear.is_clickeado():
                if len(self.entry.text) > 0:
                    self.perfiles.append(PerfilJugador(self.entry.text))
                    self.entry.delete()
                self.boton_crear.clickeado = False
            if self.boton_seleccionar.is_clickeado():
                if self.lista.seleccion.seleccionado:
                    if self.lista.seleccion.seleccionado.contenido:
                        self.actual = self.lista.seleccion.seleccionado.contenido
                        self.activo = False
                self.boton_seleccionar.clickeado = False
            if self.boton_eliminar.is_clickeado():
                if self.lista.seleccion.seleccionado:
                    if self.lista.seleccion.seleccionado.contenido:
                        self.lista.borrar(self.lista.seleccion.seleccionado.contenido)
                self.boton_eliminar.clickeado = False
    def draw_cortina(self, pantalla):
        if self.activo:
            pantalla.blit(self.cortina, (0, 0))
    def draw(self, pantalla):
        if self.activo:
            pantalla.blit(self.fondo_imagen, (0, 0))
            self.boton_crear.draw(pantalla)
            self.boton_seleccionar.draw(pantalla)
            self.boton_eliminar.draw(pantalla)
            self.entry.render(pantalla, pygame.Color("black"), (470, 250))
            self.lista.draw(pantalla)
    def update(self):
        pass

class MenuPause:
    def __init__(self, director):
        self.fondo_imagen = pygame.image.load("images/menucito.png").convert_alpha()
        self.director = director
        self.activo = False
    def event(self):
        if self.activo:
            for event in pygame.event.get():
                if event.type == KEYDOWN:
                    if event.key == K_ESCAPE:
                        self.activo = False
    def draw(self, pantalla):
        if self.activo:
            pantalla.blit(self.fondo_imagen, (0, 0))

class MenuStage:
    def __init__(self, director):
        self.director = director
        self.fondo_imagen = pygame.image.load("images/menu.png")
        self.boton = pygame.image.load("images/boton1.png")
        self.rectBoton = self.boton.get_rect()
        self.rectBoton.centerx = 850
        self.rectBoton.centery = 150
        self.press = False
    def event(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit(0)
            if event.type == MOUSEBUTTONDOWN:
                if event.button == 1:
                    if pygame.mouse.get_pos()[0] in range(self.rectBoton.left, self.rectBoton.right):
                        if pygame.mouse.get_pos()[1] in range(self.rectBoton.top, self.rectBoton.bottom):
                            self.press = True
                        else:
                            self.press = False
                    else:
                        self.press = False
            if event.type == MOUSEBUTTONUP:
                if event.button == 1:
                    self.press = False
                    if pygame.mouse.get_pos()[0] in range(self.rectBoton.left, self.rectBoton.right):
                        if pygame.mouse.get_pos()[1] in range(self.rectBoton.top, self.rectBoton.bottom):
                            self.director.quit()
    def update(self):
        if self.press:
            self.boton = pygame.image.load("images/boton2.png")
        else:
            self.boton = pygame.image.load("images/boton1.png")
    def draw(self, pantalla):
        pantalla.blit(self.fondo_imagen, (0, 0))
        pantalla.blit(self.boton, self.rectBoton)

class EscenaJuego:
    def __init__(self, director):
        self.tab = Tablero()
        self.director = director
        self.fondo_imagen = pygame.image.load("images/fondo.png")
        self.nivel = 0
        self.robotsGrupo = pygame.sprite.RenderUpdates()
        self.balasGrupo = pygame.sprite.RenderUpdates()
        self.aliensGrupo = pygame.sprite.RenderUpdates()
        #self.aliensGrupo.add(AlienAtaqueComun(self.tab.get_linea_at(65, 65)))
        self.menu = MenuPause(self.director)
    def update(self):
        for alien in self.aliensGrupo:
            if alien.rect.right < 0:
                self.director.quit()
            if alien.atacando == True and len(pygame.sprite.spritecollide(alien, self.robotsGrupo, False)) == 0:
                alien.atacando = False
            l = pygame.sprite.spritecollide(alien, self.balasGrupo, False, pygame.sprite.collide_mask)
            for bala in l:
                alien.recibir_ataque(bala.ataque)
                bala.kill()
        for robot in self.robotsGrupo:
            a = pygame.sprite.spritecollide(robot, self.aliensGrupo, False)
            for alien in a:
                alien.atacando = True
                robot.recibir_ataque(alien.velocidad_ataque, alien.ataque)
    def draw(self, pantalla):
        pantalla.blit(self.fondo_imagen, (0, 0))
        self.robotsGrupo.update()
        self.balasGrupo.update()
        self.aliensGrupo.update()
        self.robotsGrupo.clear(pantalla, self.fondo_imagen)
        self.balasGrupo.clear(pantalla, self.fondo_imagen)
        self.aliensGrupo.clear(pantalla, self.fondo_imagen)
        self.robotsGrupo.draw(pantalla)
        self.balasGrupo.draw(pantalla)
        self.aliensGrupo.draw(pantalla)
        if self.menu.activo:
            self.menu.draw(pantalla)
            while self.menu.activo:
                self.menu.event()
                pygame.display.update()
    def event(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit(0)
            if event.type == MOUSEBUTTONDOWN:
                if event.button == 1:
                    try:
                        linea = self.tab.get_linea_at(pygame.mouse.get_pos()[0], pygame.mouse.get_pos()[1])
                        cuadro = self.tab.get_cuadro_at(pygame.mouse.get_pos()[0], pygame.mouse.get_pos()[1])
                        if cuadro.unidad == None:
                            a = RobotDefensivoComun(cuadro, linea, self.balasGrupo)
                            a.cuadro = cuadro
                            cuadro.unidad = a
                            self.robotsGrupo.add(a)
                    except:
                        pass
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    self.menu.activo = True
    #ESTA ES EL METODO PARA Q TESTES UN ATACANTE Q HAYAS CREADO OK? (:
    def testear_atacante(self, cls):
        self.aliensGrupo.add(cls(self.tab.get_linea_at(100, 201)))